from langchain.agents import initialize_agent, Tool
from langchain_community.chat_models import ChatTongyi
from langchain.agents import AgentType
from langchain.memory import ConversationBufferMemory
from langchain.utilities import SQLDatabase
# from langchain.tools import Tool
import requests
import os

# 1、读取环境变量配置的api_key和url
AI_QW_KEY = os.getenv("AI_QW_KEY")
AI_QW_URL = os.getenv("AI_QW_URL")

# 设置通义千问的 API Key
os.environ["DASHSCOPE_API_KEY"] = AI_QW_KEY  # 替换为你的 API Key
# 可选：设置通义千问的 API 端点（如果需要）
os.environ["DASHSCOPE_ENDPOINT"] = AI_QW_URL


# --------------------------
# 第一步：创建天气查询工具
# --------------------------
def get_weather(location: str) -> str:
    """查询指定城市的实时天气"""
    API_KEY = "LHYS7gLVBOCEIQEsE-7g"  # 替换为你的心知天气API密钥
    url = f"https://api.seniverse.com/v3/weather/now.json?key={API_KEY}&location={location}&language=zh-Hans&unit=c"

    try:
        response = requests.get(url)
        data = response.json()
        weather = data['results'][0]['now']['text']
        temp = data['results'][0]['now']['temperature']
        return f"{location}当前天气：{weather}，温度：{temp}℃"
    except Exception as e:
        return f"天气查询失败：{str(e)}"


# --------------------------
# 第二步：创建MySQL数据库工具
# --------------------------
# 先安装数据库驱动：pip install mysql-connector-python
db = SQLDatabase.from_uri(
    "mysql+mysqlconnector://root:root@localhost:3306/db_xxx"  # 替换为你的数据库信息
)


def query_database(query: str) -> str:
    """执行SQL查询并返回结果"""
    try:
        result = db.run(query)
        return str(result)
    except Exception as e:
        return f"数据库查询错误：{str(e)}"


# --------------------------
# 第三步：创建Agent
# --------------------------
# 初始化通义千问模型
llm = ChatTongyi()

tools = [Tool(
    name="WeatherQuery",
    func=get_weather,
    description="用于查询指定城市的实时天气信息。输入应为城市名称，例如：北京"
    ),
    Tool(
    name="DatabaseQuery",
    func=query_database,
    description="用于执行SQL数据库查询。输入应为有效的SQL查询语句，例如：SELECT * FROM users WHERE age > 30"
)]

memory = ConversationBufferMemory(memory_key="chat_history")

agent = initialize_agent(
    tools,
    llm,
    #agent=AgentType.OPENAI_FUNCTIONS,  # 使用函数调用方式 OPENAI用这个
    agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,  # 改为更适合的Agent类型
    memory=memory,
    verbose=True,  # 显示详细执行过程
    max_iterations=3,  # 限制最大推理次数
    handle_parsing_errors=True  # 添加错误处理
)

# --------------------------
# 第四步：测试Agent
# --------------------------
# 示例1：查询天气
#print(agent.run("北京的天气怎么样？"))
print(agent.run("许昌天气？"))

print("===============")

# 示例2：查询数据库
#print(agent.run("查询用户表中的记录数"))

# 示例3：组合查询
#print(agent.run("上海今天下雨吗？同时查询订单表中今天的订单数量"))


# 验证问题：
#检查天气 API 返回：
#print(get_weather('北京'))

#检查数据库连接：
# try:
#     db = SQLDatabase.from_uri("mysql+mysqlconnector://root:root@localhost:3306/db_xeasy")
#     print("数据库连接成功！")
# except Exception as e:
#     print(f"数据库连接失败：{e}")


#直接测试 LLM：
# response = llm.invoke("你好")
# print("LLM 测试响应：", response.content)

#
#print("已注册的工具：", [tool.name for tool in tools])

